[section .data]
msg_1: db "[syscall]processor id: %d, enable syscall", 10, 13, 0

[SECTION .selector]
KERNEL_CS equ (3 << 3)
USER_CS   equ (5 << 3 | 0b11)

[section .text]
[bits 64]

extern printk

extern system_call_table

; 调用参数的寄存器：
; rax: 功能号
;RDI：用于传递第一个参数。
;RSI：用于传递第二个参数。
;RDX：用于传递第三个参数。
;R10：用于传递第四个参数（注意，这并不是RDX，因为RDX在syscall指令执行时被用于其他目的）。
;R8：用于传递第五个参数。
;R9：用于传递第六个参数。
; 注意：RCX和R11由处理器使用，保存RIP和RFLAGS的内容，不能占用
global syscall_handler_entry
syscall_handler_entry:
    call [system_call_table + rax * 8]

    o64 sysret

; 开启syscall、配置
; void enbale_syscall(void);
global enbale_syscall
enbale_syscall:
.print:
    swapgs
    mov rsi, [gs:0]
    swapgs

    mov rdi, msg_1
    call printk

.enable:
    mov ecx, 0x0c0000080
    rdmsr
    bts eax, 0
    wrmsr

.fill_ia32_star:
    mov ecx, 0xc0000081
    mov edx, (USER_CS << 16) | KERNEL_CS
    xor eax, eax
    wrmsr

.fill_ia32_lstar:
    mov ecx, 0xC0000082                 ; 将 IA32_LSTAR 寄存器的地址加载到 ecx
    mov eax, syscall_handler_entry      ; 将目标地址的低 32 位加载到 eax
    xor edx, edx                        ; 将目标地址的高 32 位加载到 edx
    wrmsr                               ; 将 eax 和 edx 的值写入 IA32_LSTAR 寄存器

.fill_ia32_fmask:
    mov ecx, 0xc0000084                      ;FMASK
    xor edx, edx
    mov eax, 0x00047700                      ;要求TF=IF=DF=AC=0；IOPL=00
    wrmsr

    ret